#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

/*
给定一个包含 [0, n] 中 n 个数的数组 nums ，找出 [0, n] 这个范围内没有出现在数组中的那个数。

 

示例 1：

输入：nums = [3,0,1]
输出：2
解释：n = 3，因为有 3 个数字，所以所有的数字都在范围 [0,3] 内。2 是丢失的数字，因为它没有出现在 nums 中。
示例 2：

输入：nums = [0,1]
输出：2
解释：n = 2，因为有 2 个数字，所以所有的数字都在范围 [0,2] 内。2 是丢失的数字，因为它没有出现在 nums 中。
示例 3：

输入：nums = [9,6,4,2,3,5,7,0,1]
输出：8
解释：n = 9，因为有 9 个数字，所以所有的数字都在范围 [0,9] 内。8 是丢失的数字，因为它没有出现在 nums 中。
示例 4：

输入：nums = [0]
输出：1
解释：n = 1，因为有 1 个数字，所以所有的数字都在范围 [0,1] 内。1 是丢失的数字，因为它没有出现在 nums 中。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/missing-number
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
class Solution {
public:
    int findLongestChain(vector<vector<int>>& pairs) {
        sort(pairs.begin(),pairs.end(),[](vector<int>& a,vector<int>& b){
            if(a[0]==b[0])return a[1]<=b[1];
            else return a[0]<=b[0];
        });
        int n=pairs.size();
        vector<vector<int>>dp;
        dp.push_back(pairs[0]);
        for(int i=1;i<n;i++){
            int l=0,r=dp.size();
            while(l<r){
                int mid=l+(r-l)/2;
                if(dp[mid][1]>=pairs[i][0])r=mid;
                else l=mid+1;
            }
            if(l>=dp.size())dp.push_back(pairs[i]);
            else if(dp[l][1]>pairs[i][1])dp[l]=pairs[i];
        }
        return dp.size();
    }
};